#include <cstdio>
#include <algorithm>
#include <cassert>
#define fi first
#define se second
using namespace std;
int read(){
	char c=getchar();int x=0;
	while(c<48||c>57) c=getchar();
	do x=(x<<1)+(x<<3)+(c^48),c=getchar();
	while(c>=48&&c<=57);
	return x;
}
const int N=300003;
typedef long long ll;
int fl[N],fr[N];
int gl[N],gr[N];
int n,q;
typedef pair<int,ll> pil;
void chmn(int &x,int v){if(x>v) x=v;}
void chmx(int &x,int v){if(x<v) x=v;}
int stk[N],tp;
struct sgt{
#define lc (p<<1)
#define rc (p<<1|1)
#define Lc (q<<1)
#define Rc (q<<1|1)
	int ql[N<<2],qr[N<<2];
	int sl[N<<2],sr[N<<2];
	pil ps[N<<2];int pt[N<<2];
	int *al,*ar;
	pil calc(int p,pil cur){
		if(cur.fi>sr[p]) cur=pil(sr[p],cur.se+cur.fi-sr[p]);
		if(cur.fi<sl[p]) cur=pil(sl[p],cur.se);
		if(ql[p]<=qr[p]) return cur;
		return pil(ps[p].fi,cur.se+max(cur.fi-pt[p],0)+ps[p].se);
	}
	void pushup(int p,int l,int r){
		ql[p]=max(ql[lc],ql[rc]);
		qr[p]=min(qr[lc],qr[rc]);
		if(ql[p]<=qr[p]){sl[p]=ql[p];sr[p]=qr[p];}
		else{
			sl[p]=sl[lc];sr[p]=sr[lc];pt[p]=pt[lc];
			if(ql[lc]<=qr[lc]){
				int q=rc;
				int mid=(l+r)>>1;
				l=mid+1;
				if(sr[rc]<sl[p]){
					while(l<r){
						mid=(l+r)>>1;
						if(qr[Lc]<sl[p]){stk[++tp]=Rc;q=Lc;r=mid;}
						else{
							chmx(sl[p],ql[Lc]);
							chmn(sr[p],qr[Lc]);
							q=Rc;l=mid+1;
						}
					}
					// assert(qr[q]<sl[p]);
					ps[p]=pil(pt[p]=qr[q],0);
					while(tp) ps[p]=calc(stk[tp--],ps[p]);
					return;
				}
				if(sl[rc]>sr[p]){
					while(l<r){
						mid=(l+r)>>1;
						if(ql[Lc]>sr[p]){stk[++tp]=Rc;q=Lc;r=mid;}
						else{
							chmx(sl[p],ql[Lc]);
							chmn(sr[p],qr[Lc]);
							q=Rc;l=mid+1;
						}
					}
					// assert(ql[q]>sr[p]);
					ps[p]=pil(pt[p]=ql[q],0);
					while(tp) ps[p]=calc(stk[tp--],ps[p]);
					return;
				}
				ps[p]=ps[rc];pt[p]=pt[rc];
				chmx(sl[p],sl[rc]);
				chmn(sr[p],sr[rc]);
			}
			else ps[p]=calc(rc,ps[lc]);
		}
	}
	void build(int p=1,int l=1,int r=n){
		if(l==r){
			sl[p]=ql[p]=al[l];
			sr[p]=qr[p]=ar[r];
			return;
		}
		int mid=(l+r)>>1;
		build(lc,l,mid);
		build(rc,mid+1,r);
		pushup(p,l,r);
	}
	void update(int x,int p=1,int l=1,int r=n){
		if(l==r){
			sl[p]=ql[p]=al[l];
			sr[p]=qr[p]=ar[r];
			return;
		}
		int mid=(l+r)>>1;
		if(x<=mid) update(x,lc,l,mid);
		else update(x,rc,mid+1,r);
		pushup(p,l,r);
	}
	pil query(pil x,int sl,int sr,int p=1,int l=1,int r=n){
		if(sl<=l&&r<=sr) return calc(p,x);
		int mid=(l+r)>>1;
		if(sl<=mid) x=query(x,sl,sr,lc,l,mid);
		if(sr>mid) x=query(x,sl,sr,rc,mid+1,r);
		return x;
	}
#undef lc
#undef rc
#undef Lc
#undef Rc
}F,G;
int main(){
	freopen("study.in","r",stdin);
	freopen("study.out","w",stdout);
	n=read();q=read();
	F.al=fl;F.ar=fr;
	G.al=gl;G.ar=gr;
	for(int i=1;i<n;++i){
		int l=read(),r=read()-1;
		fl[i]=l-i;fr[i]=r-i;
		gl[n-i]=l+i+1;gr[n-i]=r+i+1;
	}
	F.build();G.build();
	while(q--){
		int op=read();
		if(op==1){
			int x=read(),l=read(),r=read()-1;
			fl[x]=l-x;fr[x]=r-x;
			gl[n-x]=l+x+1;gr[n-x]=r+x+1;
			F.update(x);G.update(n-x);
		}
		else{
			int a=read(),b=read(),c=read(),d=read();
			long long res=0;
			if(a<c){
				b-=a;d-=c;
				pil tmp=F.query(pil(b,0),a,c-1);
				b=tmp.fi;res+=tmp.se;
			}
			if(a>c){
				b+=a;d+=c;
				pil tmp=G.query(pil(b,0),n-a+1,n-c);
				b=tmp.fi;res+=tmp.se;
			}
			if(b>d) res+=b-d;
			printf("%lld\n",res);
		}
	}
	return 0;
}
